inspector: Avoid weak ref problems
authorMatthias Clasen <mclasen@redhat.com>
Wed, 21 May 2014 10:41:20 +0000 (06:41 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Wed, 21 May 2014 10:44:44 +0000 (06:44 -0400)
We know the objects in a size group are always widgets, so we
can avoid hard-to-track down problems with weak references by
just cleaning up when the object gets destroyed. There is still
a chance that we show a widget as part of the group after it
has been removed, but size groups simply have no signals that
would let us avoid that.

gtk/inspector/size-groups.c

index d4b27d1295a8914a1fe778402b8b6d46d5687a02..a077a2093a277892a4e86e82ac107f45737323f6 100644 (file)
@@ -64,6 +64,30 @@ size_group_row_get_property (GObject    *object,
     }
 }
 
+static void
+size_group_row_widget_destroyed (GtkWidget *widget, SizeGroupRow *row)
+{
+  GtkWidget *parent;
+
+  parent = gtk_widget_get_parent (GTK_WIDGET (row));
+  if (parent)
+    gtk_container_remove (GTK_CONTAINER (parent), GTK_WIDGET (row));
+}
+
+static void
+set_widget (SizeGroupRow *row, GtkWidget *widget)
+{
+  if (row->widget)
+    g_signal_handlers_disconnect_by_func (row->widget,
+                                          size_group_row_widget_destroyed, row);
+
+  row->widget = widget;
+
+  if (row->widget)
+    g_signal_connect (row->widget, "destroy",
+                      G_CALLBACK (size_group_row_widget_destroyed), row);
+}
+
 static void
 size_group_row_set_property (GObject      *object,
                              guint         property_id,
@@ -75,11 +99,7 @@ size_group_row_set_property (GObject      *object,
   switch (property_id)
     {
     case PROP_WIDGET:
-      if (row->widget)
-        g_object_remove_weak_pointer (G_OBJECT (row->widget), (gpointer *)&row->widget);
-      row->widget = g_value_get_pointer (value);
-      if (row->widget)
-        g_object_add_weak_pointer (G_OBJECT (row->widget), (gpointer *)&row->widget);
+      set_widget (row, g_value_get_pointer (value));
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
@@ -91,8 +111,7 @@ size_group_row_finalize (GObject *object)
 {
   SizeGroupRow *row = (SizeGroupRow *)object;
 
-  if (row->widget)
-    g_object_remove_weak_pointer (G_OBJECT (row->widget), (gpointer *)&row->widget);
+  set_widget (row, NULL);
 
   G_OBJECT_CLASS (size_group_row_parent_class)->finalize (object);
 }